package ar.com.seminario.service;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import ar.com.seminario.common.persistence.exception.DaoException;
import ar.com.seminario.common.service.definition.BaseService;
import ar.com.seminario.common.service.exception.ServiceException;
import ar.com.seminario.dao.CandidatoDao;
import ar.com.seminario.dao.DetallePerfilDao;
import ar.com.seminario.dao.EntrevistaDao;
import ar.com.seminario.dao.EntrevistaRRHHDao;
import ar.com.seminario.dao.EntrevistaSuperiorDao;
import ar.com.seminario.dao.EntrevistaTecnicaDao;
import ar.com.seminario.dao.PerfilDao;
import ar.com.seminario.dao.SolicitudCandidatoDao;
import ar.com.seminario.dto.EntrevistaDto;
import ar.com.seminario.dto.EntrevistaRRHHDto;
import ar.com.seminario.dto.EntrevistaSuperiorDto;
import ar.com.seminario.dto.EntrevistaTecnicaDto;
import ar.com.seminario.model.Candidato;
import ar.com.seminario.model.DetallePerfil;
import ar.com.seminario.model.Entrevista;
import ar.com.seminario.model.EntrevistaRRHH;
import ar.com.seminario.model.EntrevistaSuperior;
import ar.com.seminario.model.EntrevistaTecnica;
import ar.com.seminario.model.Perfil;
import ar.com.seminario.model.SolicitudCandidato;
import ar.com.seminario.model.SolicitudIngreso;
import ar.com.seminario.model.enumerados.EstadoSolicitudCandidato;

/**
 * Servicio de acceso a las entrevistas.
 * 
 * @author Pablo Lamas
 * 
 */
@Service
@Transactional
public class EntrevistaService extends BaseService implements IEntrevistaService {

	/**
	 * Servicio de acceso a {@link SolicitudIngreso}.
	 */
	@Autowired
	private ISolicitudIngresoService solicitudIngresoService;
	
	/**
	 * Servicio de acceso a {@link Candidato}.
	 */
	@Autowired
	private ICandidatoService candidatoService;
	
	/**
	 * Servicio de acceso a {@link SolicitudCandidato}.
	 */
	@Autowired
	private ISolicitudCandidatoService solicitudCandidatoService;
	
	
	public EntrevistaDto getEntrevistaDto(Entrevista entrevista) {

		EntrevistaDto entrevistaDto = new EntrevistaDto();

		if (entrevista.getCandidato() != null) {
			entrevistaDto.setCandidatoId(entrevista.getCandidato().getId());
		}
		//entrevistaDto.setEstaAprobado(entrevista.getEstaAprobado());
		//entrevistaDto.setEstadoSolicitudId(entrevista.getEstadoSolicitud().getId());

		if (entrevista.getSolicitudIngreso() != null) {
			entrevistaDto.setSolicitudIngresoId(entrevista.getSolicitudIngreso().getId());
		}
		//entrevistaDto.setTipoEntrevistaId(entrevista.getTipoEntrevista().getId());

		return entrevistaDto;
	}

	public void saveEntrevistaRRHH(EntrevistaRRHHDto entrevistaRRHHDto)
			throws ServiceException {
		
		try {
		
		SolicitudIngreso solicitud = this.solicitudIngresoService.
				getSolicitudPorId(entrevistaRRHHDto.getSolicitudIngresoId());
		
		if(solicitud!=null){
			
			EntrevistaRRHH entrevistaRRHH = new EntrevistaRRHH();
			
			entrevistaRRHH.setAnioOtro(entrevistaRRHHDto.getAnioOtro());
			entrevistaRRHH.setAnioTerciario(entrevistaRRHHDto.getAnioTerciario());
			entrevistaRRHH.setAnioUniversitario(entrevistaRRHHDto.getAnioUniversitario());
			entrevistaRRHH.setColaboracion(entrevistaRRHHDto.getColaboracion());
			entrevistaRRHH.setCompromiso(entrevistaRRHHDto.getCompromiso());
			entrevistaRRHH.setCompromisoRentabilidad(entrevistaRRHHDto.getCompromisoRentabilidad());
			entrevistaRRHH.setComunicacionEficaz(entrevistaRRHHDto.getComunicacionEficaz());
			entrevistaRRHH.setCondicionesLaborales(entrevistaRRHHDto.getCondicionesLaborales());
			entrevistaRRHH.setConduccionPersonas(entrevistaRRHHDto.getConduccionPersonas());
			entrevistaRRHH.setConocimientoDelNegocio(entrevistaRRHHDto.getConocimientoDelNegocio());
			entrevistaRRHH.setConocimientoIndustriaYMercado(entrevistaRRHHDto.getConocimientoIndustriaYMercado());
			entrevistaRRHH.setConocimientoTecnico(entrevistaRRHHDto.getConocimientoTecnico());
			entrevistaRRHH.setCredibilidadTecnica(entrevistaRRHHDto.getCredibilidadTecnica());
			entrevistaRRHH.setDisponibilidadIngreso(entrevistaRRHHDto.getDisponibilidadIngreso());
			entrevistaRRHH.setDisponibleViajar(entrevistaRRHHDto.getDisponibleViajar());
			entrevistaRRHH.setElaboracionSoluciones(entrevistaRRHHDto.getElaboracionSoluciones());
			
			entrevistaRRHH.setExpresionVerbal(entrevistaRRHHDto.getExpresionVerbal());
			entrevistaRRHH.setInfluenciaYNegociacion(entrevistaRRHHDto.getInfluenciaYNegociacion());
			entrevistaRRHH.setInstitucionOtro(entrevistaRRHHDto.getInstitucionOtro());
			entrevistaRRHH.setInstitucionTerciario(entrevistaRRHHDto.getInstitucionTerciario());
			entrevistaRRHH.setInstitucionUniversitario(entrevistaRRHHDto.getInstitucionUniversitario());
			entrevistaRRHH.setMotivacionParaCambio(entrevistaRRHHDto.getMotivacionParaCambio());
			entrevistaRRHH.setNivelFrances(entrevistaRRHHDto.getNivelFrances());
			entrevistaRRHH.setNivelIngles(entrevistaRRHHDto.getNivelIngles());
			entrevistaRRHH.setNivelOffice(entrevistaRRHHDto.getNivelOffice());
			entrevistaRRHH.setNivelPortugues(entrevistaRRHHDto.getNivelPortugues());
			entrevistaRRHH.setNivelProgramacion(entrevistaRRHHDto.getNivelProgramacion());
			entrevistaRRHH.setObservaciones(entrevistaRRHHDto.getObservaciones());
			entrevistaRRHH.setOrientacionCliente(entrevistaRRHHDto.getOrientacionCliente());
			entrevistaRRHH.setOrientacionResultados(entrevistaRRHHDto.getOrientacionResultados());
			entrevistaRRHH.setPensamientoConceptual(entrevistaRRHHDto.getPensamientoConceptual());
			entrevistaRRHH.setPresentacionGeneral(entrevistaRRHHDto.getPresentacionGeneral());
			entrevistaRRHH.setPretencionesEconomicas(entrevistaRRHHDto.getPretencionesEconomicas());
			entrevistaRRHH.setRespeto(entrevistaRRHHDto.getRespeto());
			entrevistaRRHH.setTituloOtro(entrevistaRRHHDto.getTituloOtro());
			entrevistaRRHH.setTituloTerciario(entrevistaRRHHDto.getTituloTerciario());
			entrevistaRRHH.setTituloUniversitario(entrevistaRRHHDto.getTituloUniversitario());
			entrevistaRRHH.setTrabajoEnEquipo(entrevistaRRHHDto.getTrabajoEnEquipo());
			
			entrevistaRRHH.setEstaAprobado(entrevistaRRHHDto.getEstaAprobado());
				if(!entrevistaRRHHDto.getEstaAprobado())
					entrevistaRRHH.setJustificacion(entrevistaRRHHDto.getJustificacion());
					
			entrevistaRRHH.setEvaluador(entrevistaRRHHDto.getEvaluador());
			entrevistaRRHH.setFecha(new Date());
			
			EntrevistaRRHHDao dao = this.getDaoFactory().newDao(EntrevistaRRHHDao.class);
			dao.saveOrUpdate(entrevistaRRHH);
			
			Entrevista entrevista = new Entrevista();
			entrevista.setCandidato(this.candidatoService.
						getCandidatoPorId(entrevistaRRHHDto.getCandidatoId()));
			entrevista.setEntrevistaRRHH(entrevistaRRHH);
			
			solicitud.addEntrevista(entrevista);
			
			// Se guarda el candidato.
			EntrevistaDao daoEntrevista = this.getDaoFactory().newDao(EntrevistaDao.class);
			daoEntrevista.saveOrUpdate(entrevista);
			
			SolicitudCandidato postulanteAsociado = this.solicitudCandidatoService
					.getPostulanteAsociado(entrevistaRRHHDto.getSolicitudIngresoId(),entrevistaRRHHDto.getCandidatoId());
			
			if(entrevistaRRHHDto.getEstaAprobado()){
				postulanteAsociado.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.SEGUNDA_ENTREVISTA);
			}else{
				postulanteAsociado.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.RECHAZADO);
			}

			SolicitudCandidatoDao daoPostulanteAsociado = this.getDaoFactory().newDao(SolicitudCandidatoDao.class);
			daoPostulanteAsociado.saveOrUpdate(postulanteAsociado);
		}
		
		} catch (DaoException e) {
			throw new ServiceException(e);
		}
	}

	public void saveEntrevistaTecnica(EntrevistaTecnicaDto entrevistaTecnicaDto)
			throws ServiceException {
		
		try {
			
			SolicitudIngreso solicitud = this.solicitudIngresoService.
					getSolicitudPorId(entrevistaTecnicaDto.getSolicitudIngresoId());
			
			if(solicitud!=null){
				
				//Se guarda la entrevista
				EntrevistaTecnica entrevistaTecnica = new EntrevistaTecnica();
				
				entrevistaTecnica.setEstaAprobado(entrevistaTecnicaDto.getEstaAprobado());
					if(!entrevistaTecnicaDto.getEstaAprobado())
						entrevistaTecnica.setJustificacion(entrevistaTecnicaDto.getJustificacion());
						
				entrevistaTecnica.setEvaluador(entrevistaTecnicaDto.getEvaluador());
				entrevistaTecnica.setFecha(new Date());
				
				EntrevistaTecnicaDao dao = this.getDaoFactory().newDao(EntrevistaTecnicaDao.class);
				dao.saveOrUpdate(entrevistaTecnica);
				
				Entrevista entrevista = new Entrevista();
				entrevista.setCandidato(this.candidatoService.
							getCandidatoPorId(entrevistaTecnicaDto.getCandidatoId()));
				entrevista.setEntrevistaTecnica(entrevistaTecnica);
				solicitud.addEntrevista(entrevista);
				
				EntrevistaDao daoEntrevista = this.getDaoFactory().newDao(EntrevistaDao.class);
				daoEntrevista.saveOrUpdate(entrevista);

				//Se guarda el perfil cargado
				Perfil perfilDelPostulante = new Perfil();
				perfilDelPostulante.setDescripcion("Perfil del Postulante"+entrevistaTecnicaDto.getCandidatoId());
				perfilDelPostulante.setEsTemplate(false);
				perfilDelPostulante.setNombre("Perfil del Postulante"+entrevistaTecnicaDto.getCandidatoId());
				
				Integer count = 0;
				for (Long detalleId : entrevistaTecnicaDto.getDetalles()) {
					
					DetallePerfil detallePerfil = new DetallePerfil();
					
					DetallePerfilDao detallePerfilDao = this.getDaoFactory().newDao(DetallePerfilDao.class);
					DetallePerfil detallePerfilTemplate = detallePerfilDao.getDetallePerfilById(detalleId);
					
					detallePerfil.setDescripcion(detallePerfilTemplate.getDescripcion());
					detallePerfil.setEsObligatorio(detallePerfilTemplate.getEsObligatorio());
					detallePerfil.setGrupoPerfil(detallePerfilTemplate.getGrupoPerfil());
					detallePerfil.setPonderacion(detallePerfilTemplate.getPonderacion());
					detallePerfil.setValor(entrevistaTecnicaDto.getValores().get(count));
					
					detallePerfilDao.saveOrUpdate(detallePerfil);
					perfilDelPostulante.addDetallePerfil(detallePerfil);
					count++;
				}
				
				PerfilDao perfilDao = this.getDaoFactory().newDao(PerfilDao.class);
				perfilDao.saveOrUpdate(perfilDelPostulante);
				
				//Se asocia el perfil al candidato.
				CandidatoDao candidatoDao = this.getDaoFactory().newDao(CandidatoDao.class);
				Candidato candidato = candidatoDao.getCandidatoPorId(entrevistaTecnicaDto.getCandidatoId());
				candidato.setPerfil(perfilDelPostulante);
				candidatoDao.saveOrUpdate(candidato);
				
				//Se actualiza el estado de la relacion postulante-entrevistas
				SolicitudCandidato postulanteAsociado = this.solicitudCandidatoService
						.getPostulanteAsociado(entrevistaTecnicaDto.getSolicitudIngresoId(),entrevistaTecnicaDto.getCandidatoId());
				if(entrevistaTecnicaDto.getEstaAprobado()){
					postulanteAsociado.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.TERCER_ENTREVISTA);
				}else{
					postulanteAsociado.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.RECHAZADO);
				}
				
				SolicitudCandidatoDao daoPostulanteAsociado = this.getDaoFactory().newDao(SolicitudCandidatoDao.class);
				daoPostulanteAsociado.saveOrUpdate(postulanteAsociado);
			}
			
		} catch (DaoException e) {
			throw new ServiceException(e);
		}
	}

	public void saveEntrevistaSuperior(EntrevistaSuperiorDto entrevistaSuperiorDto) throws ServiceException {

		try {
			
			SolicitudIngreso solicitud = this.solicitudIngresoService.
					getSolicitudPorId(entrevistaSuperiorDto.getSolicitudIngresoId());
			
			if(solicitud!=null){
				
				//Se guarda la entrevista
				EntrevistaSuperior entrevistaSuperior = new EntrevistaSuperior();
				
				entrevistaSuperior.setEstaAprobado(entrevistaSuperiorDto.getEstaAprobado());
					if(!entrevistaSuperiorDto.getEstaAprobado())
						entrevistaSuperior.setJustificacion(entrevistaSuperiorDto.getJustificacion());
						
				entrevistaSuperior.setEvaluador(entrevistaSuperiorDto.getEvaluador());
				entrevistaSuperior.setFecha(new Date());
				
				EntrevistaSuperiorDao dao = this.getDaoFactory().newDao(EntrevistaSuperiorDao.class);
				dao.saveOrUpdate(entrevistaSuperior);
				
				Entrevista entrevista = new Entrevista();
				entrevista.setCandidato(this.candidatoService.
							getCandidatoPorId(entrevistaSuperiorDto.getCandidatoId()));
				entrevista.setEntrevistaSuperior(entrevistaSuperior);
				solicitud.addEntrevista(entrevista);
				
				EntrevistaDao daoEntrevista = this.getDaoFactory().newDao(EntrevistaDao.class);
				daoEntrevista.saveOrUpdate(entrevista);

				//Se actualiza el estado de la relacion postulante-entrevistas
				SolicitudCandidato postulanteAsociado = this.solicitudCandidatoService
						.getPostulanteAsociado(entrevistaSuperiorDto.getSolicitudIngresoId(),entrevistaSuperiorDto.getCandidatoId());
				
				if(entrevistaSuperiorDto.getEstaAprobado()){
					postulanteAsociado.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.APROBADO);
				}else{
					postulanteAsociado.setEstadoSolicitudCandidatoId(EstadoSolicitudCandidato.RECHAZADO);
				}
				
				SolicitudCandidatoDao daoPostulanteAsociado = this.getDaoFactory().newDao(SolicitudCandidatoDao.class);
				daoPostulanteAsociado.saveOrUpdate(postulanteAsociado);
			}
			
		} catch (DaoException e) {
			throw new ServiceException(e);
		}

	}

}